home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / util / misc / VMM_src.lha / VMM / traphandler60.asm < prev    next >
Encoding:
Assembly Source File  |  1995-12-16  |  11.8 KB  |  346 lines

  1.                     INCLUDE   "exec/funcdef.i"
  2.                     INCLUDE   "exec/exec_lib.i"
  3.                     INCLUDE   "exec/execbase.i"
  4.                     INCLUDE   "exec/lists.i"
  5.                     INCLUDE   "exec/ports.i"
  6.                     INCLUDE   "exec/ables.i"
  7.                     INCLUDE   "shared_defs.i"
  8.                     INCLUDE   "macros.i"
  9.                     IFD       DEBUG
  10.                     INCLUDE   "exec/semaphores.i"
  11.                     ENDC
  12.  
  13.  
  14. * $Id: traphandler60.asm,v 1.3 95/12/16 18:36:31 Martin_Apel Exp $
  15.  
  16.                     IFD       DYN_MMU_SETUP
  17.                     XDEF      _DynMMUTrap60
  18.                     ELSE
  19.                     XDEF      _TrapHandler60
  20.                     ENDC
  21.  
  22.                     XREF      _PageHandlerTask
  23.                     XREF      _VM_ManagerProcess
  24.                     XREF      _PageFaultSignal
  25.                     XREF      _Free
  26.                     XREF      _PageReq
  27.                     XREF      _VirtAddrStart
  28.                     XREF      _VirtAddrEnd
  29.                     XREF      _OrigWait
  30.  
  31.                     IFD       DYN_MMU_SETUP
  32.                     XREF      _InstallMapping
  33.                     XREF      _OrigDynMMUTrap
  34.                     ELSE
  35.                     XREF      _OrigTrapHandler
  36.                     ENDC
  37.  
  38.                     IFD       DEBUG
  39.                     XREF      _EnforcerHits
  40.                     XREF      _InstructionFaults
  41.                     XREF      _FindHunk
  42.                     ENDC
  43.  
  44.                     MACHINE   MC68060
  45.  
  46. * On the 68040 and probably on the 68060 too, VMM and Enforcer work 
  47. * together, because they use the same pagesize (4K). Then address 4 
  48. * (pointer to ExecBase) is mapped as invalid. Access faults to this 
  49. * address should be as quick as possible therefore.
  50. * On the 68030, VMM and Enforcer don't work together since they use
  51. * different pagesizes, thus making the speed argument for address 4
  52. * invalid.
  53.  
  54.  
  55. FRAMESIZE_B         EQU       16
  56. FRAMESIZE_L         EQU       FRAMESIZE_B/4
  57.  
  58. SAVED_REGS          REG       d0-d1/a0-a2/a6
  59. NUM_REGS            EQU       6
  60.  
  61.                     * Offsets into the stackframe
  62. OFFS_SR             EQU       $0
  63. OFFS_PC             EQU       $2
  64. OFFS_FRAME_ID       EQU       $6
  65. OFFS_FA             EQU       $8
  66. OFFS_FSLW           EQU       $C
  67.  
  68.                     * Bit definitions
  69.  
  70.                     BITDEF    SR,SV,5
  71.                     BITDEF    FSLW,MA,27
  72.                     BITDEF    FSLW,LK,25
  73.                     BITDEF    FSLW,IO,15
  74.                     BITDEF    FSLW,PBE,14
  75.                     BITDEF    FSLW,SBE,13
  76.                     BITDEF    FSLW,PTA,12
  77.                     BITDEF    FSLW,PTB,11
  78.                     BITDEF    FSLW,IL,10
  79.                     BITDEF    FSLW,PF,9
  80.                     BITDEF    FSLW,SP,8
  81.                     BITDEF    FSLW,WP,7
  82.                     BITDEF    FSLW,TWE,6
  83.                     BITDEF    FSLW,RE,5
  84.                     BITDEF    FSLW,WE,4
  85.                     BITDEF    FSLW,TTR,3
  86.                     BITDEF    FSLW,BPE,2
  87.                     BITDEF    FSLW,SEE,0
  88.  
  89.                     BITDEF    CACR,CABC,22
  90.  
  91. UNWANTED_EVENTS     EQU       (FSLWF_LK|FSLWF_PBE|FSLWF_SBE|FSLWF_IL|FSLWF_SP|FSLWF_WP|FSLWF_TWE|FSLWF_RE|FSLWF_WE|FSLWF_TTR|FSLWF_SEE)
  92.  
  93.                     SECTION   CODE
  94.  
  95.                     IFD       DYN_MMU_SETUP
  96. _DynMMUTrap60:
  97.                     ELSE
  98. _TrapHandler60:
  99.                     ENDC
  100.  
  101.                     move.l    d0,-(sp)
  102.                     move.w    OFFS_FRAME_ID+4(sp),d0
  103.                     cmp.w     #$4008,d0
  104.                     beq       right_format
  105.  
  106. NoVirtMem:
  107. wrong_format:       ; restore original stack setting
  108.                     IFD       DEBUG
  109.                     move.l    OFFS_FA+4(sp),d0    ; FaultAddress
  110.                     cmpi.l    #4,d0
  111.                     beq       SysBaseAccess
  112.                     addq.l    #1,_EnforcerHits
  113.                     PRINT_DEB "EnforcerHit occurred for address %lx",d0
  114.                     move.l    OFFS_PC+4(sp),-(sp)
  115.                     jsr       _FindHunk
  116.                     addq.w    #4,sp
  117. SysBaseAccess
  118.                     ENDC
  119.                     move.l     (sp)+,d0
  120.  
  121.                     ; give it to the original handler
  122.                     IFD       DYN_MMU_SETUP
  123.                     move.l    _OrigDynMMUTrap,-(sp)
  124.                     ELSE
  125.                     move.l    _OrigTrapHandler,-(sp)
  126.                     ENDC
  127.                     rts
  128.  
  129. right_format        move.l    OFFS_FSLW+4(sp),d0
  130.                     PRINT_DEB "Trap60: FSLW = %08lx",d0
  131.                     and.l     #UNWANTED_EVENTS,d0
  132.                     bne       wrong_format
  133.  
  134.                     move.l    OFFS_FA+4(sp),d0    ; FaultAddress
  135.  
  136.                     IFND      DYN_MMU_SETUP
  137.                     IN_VM     d0,NoVirtMem
  138.                     ENDC
  139.  
  140. ValidAddr
  141.                     PRINT_DEB "TRAP: Fault for task %lx",ThisTask(a6)
  142.  
  143.                     move.l    (sp)+,d0
  144.                     btst.b    #SRB_SV,OFFS_SR(sp)
  145.                     beq       TrapFromUserMode
  146.  
  147. TrapFromSVMode:     PRINT_DEB "*** TRAP: Called from SV mode"
  148.  
  149.                     IFD       DEBUG
  150.                     PRINT_DEB "***: ThisTask = %lx",ThisTask(a6)
  151.                     moveq     #0,d0
  152.                     move.w    OFFS_SR(sp),d0
  153.                     PRINT_DEB "***: SR = %lx",d0
  154.                     move.l    OFFS_PC(sp),d0
  155.                     PRINT_DEB "***: PC = %lx",d0
  156.                     move.l    d0,-(sp)
  157.                     jsr       _FindHunk
  158.                     add.w     #4,sp
  159.  
  160.                     move.l    OFFS_FA(sp),d0
  161.                     PRINT_DEB "***: FA = %lx",d0
  162.                     move.l    usp,a0
  163.                     PRINT_DEB "***: USP = %lx",a0
  164.                     move.l    4,a0
  165.                     PRINT_DEB "***: SysBase = %lx",a0
  166.                     PRINT_DEB "***: SSP = %lx",sp
  167.                     ENDC
  168.  
  169.                     bra       SVAlarm
  170.  
  171.                     ALIGN_LONG
  172.  
  173. TrapFromUserMode    movem.l   SAVED_REGS,-(sp)
  174.  
  175.                     PRINT_DEB "TRAP: SV mode 1"
  176.  
  177.                     move.l    OFFS_FSLW+NUM_REGS*4(sp),d0
  178.                     btst.l    #FSLWB_BPE,d0
  179.                     beq       NoBranchPredError
  180.                     PRINT_DEB "Trap60: Clearing branch prediction cache"
  181.                     movec     CACR,d0
  182.                     bset.l    #CACRB_CABC,d0
  183.                     movec     d0,cacr
  184. NoBranchPredError
  185.  
  186.                     IFD       DEBUG
  187.  
  188.                     move.l    4,a6
  189.                     cmpi.b    #-1,IDNestCnt(a6)
  190.                     beq       DisableNotBroken
  191.                     PRINT_DEB "Disable broken"
  192. DisableNotBroken    cmpi.b    #-1,TDNestCnt(a6)
  193.                     beq       ForbidNotBroken
  194.  
  195.                     lea       _VirtMemSema,a0
  196.                     move.l    SS_OWNER(a0),d0
  197.                     cmp.l     ThisTask(a6),d0
  198.                     beq       ForbidNotBroken
  199. ForbidBroken        PRINT_DEB "Forbid broken"
  200. ForbidNotBroken     
  201.                     move.l    OFFS_FSLW+NUM_REGS*4(sp),d0
  202.                     btst.l    #FSLWB_IO,d0
  203.                     beq       NoInstructionFault
  204.                     move.l    OFFS_FA+NUM_REGS*4(sp),a0
  205.                     PRINT_DEB "TRAP: Instruction fault at %lx",a0
  206.                     move.l    a0,-(sp)
  207.                     jsr       _FindHunk
  208.                     add.w     #4,sp
  209.                     addq.l    #1,_InstructionFaults
  210. NoInstructionFault
  211.                     ENDC
  212.  
  213.                     lea       _Free,a0
  214.                     REMHEAD
  215.                     tst.l     d0
  216.                     move.l    d0,a2               ; does not affect CCR
  217.                     beq       SVAlarm
  218.  
  219.                     lea       TS_TmpStack+TMP_STACKSIZE(a2),a6
  220.                     move.l    usp,a0                        ; Store orig usp
  221.                     move.l    a0,-(a6)
  222.                     lea       FRAMESIZE_B+NUM_REGS*4(sp),a1
  223.                     moveq     #FRAMESIZE_L-1,d0
  224. copy_frame:         move.l    -(a1),-(a6)
  225.                     dbra      d0,copy_frame
  226.  
  227.                     lea       NUM_REGS*4(sp),a1
  228.                     moveq     #NUM_REGS-1,d0
  229. copy_reglist        move.l    -(a1),-(a6)
  230.                     dbra      d0,copy_reglist
  231.  
  232.                     move.l    a6,usp
  233.  
  234.                     lea       FRAMESIZE_B+NUM_REGS*4(sp),sp ; destroy frame
  235.  
  236.                     andi.w    #$dfff,sr                     ; switch to
  237.                                                             ; user mode
  238.                     * Tmp stack format is now
  239.                     * high:  | orig_usp
  240.                     *        | stack frame
  241.                     * low:   | SAVED_REGS
  242.  
  243.  
  244.                     PRINT_DEB "TRAP: User mode 1"
  245.  
  246.                     move.l    4,a6
  247.                     move.l    NUM_REGS*4+OFFS_FA(sp),d0
  248.                     move.l    OFFS_FSLW+NUM_REGS*4(sp),d1
  249.                     and.l     #(FSLWF_IO|FSLWF_MA),d1
  250.                     cmp.l     #FSLWF_MA,d1
  251.                     bne       NotMisaligned
  252.  
  253.                     PRINT_DEB "Misaligned fault. Address = %lx",d0
  254.                     add.l     #(PAGESIZE-1),d0
  255.                     and.w     #~(PAGESIZE-1),d0        ; ALIGN_UP
  256.  
  257. NotMisaligned       move.l    d0,TS_FaultAddress(a2)
  258.                     PRINT_DEB "FaultAddress = %lx",TS_FaultAddress(a2)
  259.                     move.l    ThisTask(a6),TS_FaultTask(a2)
  260.  
  261.                     lea       NUM_REGS*4(sp),a1
  262.                     move.l    a1,TS_TopOfStackFrame(a2)
  263.  
  264.                     IFND      DYN_MMU_SETUP
  265.                     GET_SIGNAL
  266.                     ext.b     d0
  267.                     move.w    d0,TS_WakeupSignal(a2)
  268.  
  269.                     lea       _PageReq,a0
  270.                     move.l    a2,a1
  271.                     FORBID
  272.                     ADDTAIL
  273.                     PERMIT
  274.  
  275.                     move.w    _PageFaultSignal,d1
  276.                     moveq     #1,d0
  277.                     move.l    _PageHandlerTask,a1
  278.                     lsl.l     d1,d0
  279.                     jsr       _LVOSignal(a6)
  280.  
  281.                     moveq     #1,d0
  282.                     move.w    TS_WakeupSignal(a2),d1
  283.                     lsl.l     d1,d0
  284.  
  285.                     PRINT_DEB "TRAP: User mode 2"
  286.  
  287.                     move.l    _OrigWait,a0
  288.                     jsr       (a0)            ; no need to go through patch
  289.  
  290.                     * Page is back
  291.  
  292.                     PRINT_DEB "TRAP: User mode 3"
  293.  
  294.                     move.w    TS_WakeupSignal(a2),d0
  295.                     RELEASE_SIGNAL
  296.  
  297.                     ELSE      ; DYN_MMU_SETUP
  298.  
  299.                     move.l    TS_FaultAddress(a2),-(sp)
  300.                     jsr       _InstallMapping
  301.                     add.w     #4,sp
  302.  
  303.                     ENDC
  304.  
  305.                     move.l    a5,-(sp)                 ; UserStack
  306.                     lea       PageIsBack(pc),a5
  307.                     jmp       _LVOSupervisor(a6)
  308.  
  309.  
  310.                     ALIGN_LONG
  311. PageIsBack:         PRINT_DEB "TRAP: SV mode 2"
  312.  
  313.                     add.w     #8,sp                    ; take Supervisor
  314.                     move.l    usp,a6                   ; stackframe from stack
  315.                     move.l    (a6)+,a5
  316.  
  317.                     ; copy stack frame from user stack
  318.                     lea       FRAMESIZE_B+NUM_REGS*4(a6),a1
  319.                     moveq     #FRAMESIZE_L-1,d0
  320. copy_frame2:        move.l    -(a1),-(sp)
  321.                     dbra      d0,copy_frame2
  322.  
  323.                     move.l    FRAMESIZE_B+NUM_REGS*4(a6),a0  ; orig USP
  324.                     move.l    a0,usp
  325.  
  326.                     lea       _Free,a0
  327.                     move.l    a2,a1
  328.                     ADDTAIL
  329.  
  330. *                    PRINT_DEB "TRAP: SV mode 3"
  331.  
  332.                     movem.l   (a6),SAVED_REGS
  333.                     rte
  334.  
  335. ********************************************************************
  336.  
  337. SVAlarm:            PRINT_DEB "TRAP: SV alarm"
  338.  
  339.                     move.l    4,a6
  340.                     move.l    #NoTrapStructsAlertNum,d7
  341.                     jmp       _LVOAlert(a6)
  342.  
  343. ********************************************************************
  344.  
  345.                    end
  346.